package com.dt.platform.oa.service;

import com.dt.platform.domain.oa.NetdiskFile;
import com.dt.platform.domain.oa.NetdiskFileVO;
import com.github.foxnic.api.transter.Result;
import com.github.foxnic.dao.data.PagedList;
import com.github.foxnic.dao.data.SaveMode;
import com.github.foxnic.dao.entity.ISimpleIdService;
import com.github.foxnic.sql.expr.ConditionExpr;
import com.github.foxnic.sql.expr.OrderBy;
import com.github.foxnic.sql.meta.DBField;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 文件服务接口
 * </p>
 * @author 金杰 , maillank@qq.com
 * @since 2023-09-18 14:19:47
 */

public interface INetdiskFileService extends ISimpleIdService<NetdiskFile,String> {

    Result uploadFilesInfo(String fileIds,String fdId);

    Result batchDelete(List<String> ids);

    Result move(List<String> ids,String folderId);

    Result delete(String id);

    Result restoreFromRecycle(String id);

    Result batchRestoreFromRecycle(List<String> ids);

    Result rename(String id,String name);

    Result share(List<String> ids,List<String> userIds,String shareId);
    /**
     * 添加，如果语句错误，则抛出异常
     * @param netdiskFile 数据对象
     * @return 插入是否成功
     * */
    Result insert(NetdiskFile netdiskFile);

    /**
     * 添加，根据 throwsException 参数抛出异常或返回 Result 对象
     *
     * @param netdiskFile  数据对象
     * @param throwsException 是否抛出异常，如果不抛出异常，则返回一个失败的 Result 对象
     * @return 结果 , 如果失败返回 false，成功返回 true
     */
    Result insert(NetdiskFile netdiskFile,boolean throwsException);

    /**
     * 批量插入实体，事务内
     * @param netdiskFileList 实体数据清单
     * @return 插入是否成功
     * */
    Result insertList(List<NetdiskFile> netdiskFileList);



    /**
     * 按主键删除文件
     *
     * @param id 主键
     * @return 删除是否成功
     */
    Result deleteByIdPhysical(String id);

    /**
     * 按主键删除文件
     *
     * @param id 主键
     * @return 删除是否成功
     */
    Result deleteByIdLogical(String id);

    /**
     * 批量物理删除，仅支持单字段主键表
     * @param ids 主键清单
     * @return 是否删除成功
     * */
    <T> Result deleteByIdsPhysical(List<T> ids);

    /**
     * 批量逻辑删除，仅支持单字段主键表
     * @param ids 主键清单
     * @return 是否删除成功
     * */
    <T> Result deleteByIdsLogical(List<T> ids);


    /**
     * 按主键更新文件
     *
     * @param id 主键
     * @return 是否更新成功
     */
    boolean update(DBField field,Object value , String id);

    /**
     * 更新，如果执行错误，则抛出异常
     * @param netdiskFile 数据对象
     * @param mode 保存模式
     * @return 保存是否成功
     * */
    Result update(NetdiskFile netdiskFile , SaveMode mode);


    /**
     * 更新，根据 throwsException 参数抛出异常或返回 Result 对象
     *
     * @param netdiskFile 数据对象
     * @param mode SaveMode,数据更新的模式
     * @param throwsException 是否抛出异常，如果不抛出异常，则返回一个失败的 Result 对象
     * @return 结果
     */
    Result update(NetdiskFile netdiskFile , SaveMode mode,boolean throwsException);


    /**
     * 更新实体集，事务内
     * @param netdiskFileList 数据对象列表
     * @param mode 保存模式
     * @return 保存是否成功
     * */
    Result updateList(List<NetdiskFile> netdiskFileList, SaveMode mode);

    /**
     * 保存实体，根据 throwsException 参数抛出异常或返回 Result 对象
     * @param netdiskFile 实体数据
     * @param mode 保存模式
     * @param throwsException 是否抛出异常，如果不抛出异常，则返回一个失败的 Result 对象
     * @return 保存是否成功
     * */
    Result save(NetdiskFile netdiskFile , SaveMode mode,boolean throwsException);

    /**
     * 保存实体，如果语句错误，则抛出异常
     * @param netdiskFile 实体数据
     * @param mode 保存模式
     * @return 保存是否成功
     * */
    Result save(NetdiskFile netdiskFile , SaveMode mode);

    /**
     * 保存实体，如果主键值不为null，则更新，否则插入
     * @param netdiskFileList 实体数据清单
     * @param mode 保存模式
     * @return 保存是否成功
     * */
    Result saveList(List<NetdiskFile> netdiskFileList , SaveMode mode);

    /**
     * 检查实体中的数据字段是否已经存在 . 判断 主键值不同，但指定字段的值相同的记录是否存在
     * @param netdiskFile  实体对象
     * @param field  字段清单，至少指定一个
     * @return 是否已经存在
     * */
    boolean checkExists(NetdiskFile netdiskFile,DBField... field);


    /**
     * 按主键获取文件
     *
     * @param id 主键
     * @return NetdiskFile 数据对象
     */
    NetdiskFile getById(String id);

    /**
     * 按 id 获取多个对象
     * @param ids  主键清单
     * @return 实体集
     * */
    List<NetdiskFile> queryListByIds(List<String> ids);

    /**
     * 按 id 列表查询 Map
     * @param ids  主键清单
     * */
    Map<String, NetdiskFile> queryMapByIds(List<String> ids);



    /**
     * 检查 实体 是否已经存在 , 判断 主键值不同，但指定字段的值相同的记录是否存在
     *
     * @param netdiskFile 数据对象
     * @return 判断结果
     */
    Boolean checkExists(NetdiskFile netdiskFile);

    /**
     * 根据实体数构建默认的条件表达式, 不支持 Join 其它表
     * @param sample 数据样例
     * @return ConditionExpr 条件表达式
     * */
    ConditionExpr buildQueryCondition(NetdiskFile sample);

    /**
     * 根据实体数构建默认的条件表达式, 不支持 Join 其它表
     * @param sample 数据样例
     * @param tableAliase 数据表别名
     *  @return ConditionExpr 条件表达式
     * */
    ConditionExpr buildQueryCondition(NetdiskFile sample,String tableAliase);

    /**
     * 查询实体集合，默认情况下，字符串使用模糊匹配，非字符串使用精确匹配
     * @param sample  查询条件
     * @return 查询结果
     * */
    List<NetdiskFile> queryList(NetdiskFileVO sample);

    /**
     * 查询实体集合，默认情况下，字符串使用模糊匹配，非字符串使用精确匹配
     * @param sample  查询条件
     * @param condition  其它条件
     * @param orderBy  排序
     * @return 查询结果
     * */
    List<NetdiskFile> queryList(NetdiskFile sample,ConditionExpr condition,OrderBy orderBy);

    /**
     * 查询实体集合，默认情况下，字符串使用模糊匹配，非字符串使用精确匹配
     * @param sample  查询条件
     * @param orderBy  排序
     * @return 查询结果
     * */
    List<NetdiskFile> queryList(NetdiskFile sample,OrderBy orderBy);

    /**
     * 查询实体集合，默认情况下，字符串使用模糊匹配，非字符串使用精确匹配
     * @param sample  查询条件
     * @param condition  其它条件
     * @return 查询结果
     * */
    List<NetdiskFile> queryList(NetdiskFile sample,ConditionExpr condition);

    /**
     * 查询单个实体
     * @param sample  查询条件
     * @return 查询结果
     * */
    NetdiskFile queryEntity(NetdiskFile sample);

    /**
     * 分页查询实体集
     * @param sample  查询条件
     * @param pageSize 分页条数
     * @param pageIndex 页码
     * @return 查询结果
     * */
    PagedList<NetdiskFile> queryPagedList(NetdiskFileVO sample,int pageSize,int pageIndex);

    /**
     * 分页查询实体集
     * @param sample  查询条件
     * @param pageSize 分页条数
     * @param pageIndex 页码
     * @param condition  其它条件
     * @param orderBy  排序
     * @return 查询结果
     * */
    PagedList<NetdiskFile> queryPagedList(NetdiskFile sample,ConditionExpr condition,OrderBy orderBy,int pageSize,int pageIndex);

    /**
     * 分页查询实体集
     * @param sample  查询条件
     * @param pageSize 分页条数
     * @param pageIndex 页码
     * @param condition  其它条件
     * @return 查询结果
     * */
    PagedList<NetdiskFile> queryPagedList(NetdiskFile sample,ConditionExpr condition,int pageSize,int pageIndex);

    /**
     * 分页查询实体集
     * @param sample  查询条件
     * @param pageSize 分页条数
     * @param pageIndex 页码
     * @param orderBy  排序
     * @return 查询结果
     * */
    PagedList<NetdiskFile> queryPagedList(NetdiskFile sample,OrderBy orderBy,int pageSize,int pageIndex);

    /**
     * 查询指定字段的数据清单
     * @param <T> 元素类型
     * @param field 字段
     * @param type 元素类型
     * @param condition 条件表达式
     * @return 列数据
     * */
    <T> List<T> queryValues(DBField field,Class<T> type, ConditionExpr condition);

    /**
     * 查询指定字段的数据清单
     * @param <T> 元素类型
     * @param field 字段
     * @param type 元素类型
     * @param condition 条件表达式
     * @param ps 参数清单
     * @return 列数据
     * */
    <T> List<T> queryValues(DBField field, Class<T> type, String condition,Object... ps);





}